Python简单实战项目:《冰与火之歌1-5》角色关系图谱构建——数据库设计
作者:AlanLau Python爱好者社区专栏作者
简书专栏:https://www.jianshu.com/u/6da6a9668142
csdn博客:https://blog.csdn.net/alanconstantinelau
在弄任何一个数据之前,肯定是要先设计数据库的。这里打算将《冰与火之歌》(以下称《冰火》)的文本数据先存入到数据库中,后续在使用python读取数据来处理。
前期准备
需要工具:
1.peewee
2.sqlite
3.python3.5(当然python2也是可以的)
大致说一下:
1.peewee
peewee是python中的一个轻量级ORM框架。
什么是ORM框架?
不熟悉的同学可以看下面几个peewee的教程:
-peewee说明文档:http://peewee.readthedocs.io/en/latest/peewee/quickstart.html#model-definition
-Python的ORM框架Peewee使用入门(一):https://blog.csdn.net/WuLex/article/details/52565681
怎么安装?直接pip install peewee就可以,安装有困难的话可以参考我另一篇博文python中正确安装对应版本的包:https://blog.csdn.net/alanconstantinelau/article/details/69944743
2.sqlite
sqlite是一个轻量级的数据库(轻量级这一系列东西很适合做一些小型的数据项目,以后大家可以常用)。起初是我在写C#窗体应用程序的时候发现它的。sqlite很适合用来作嵌入式数据库,和C#中的DataGridView控件简直是绝配,在稍后的博客中我也会提及到用C#配合sqlite+DataGridView开发简单的数据库检索系统,感兴趣的同学可以关注下。
sqlite的语法基本和标准的sql语言相同,具体还有什么差异可以参考SQLite 教程
为什么说轻量级呢?它能够轻量到使用火狐浏览器的插件就可以打开。无需像sql
server和mySQL一样配置用户和端口。也无需再安装一个专门的软件来写sqlite的sql。所有的所有,一个火狐浏览器+sqlite
manager插件就可以完成(当然谷歌浏览器也是可以的,只是本人不常用谷歌的sqlite插件,对谷歌感兴趣的同学可以自行去查一下)。
火狐浏览器安装sqlite manager插件:打开火狐浏览器→附加组件→右上角的搜索输入:SQLite Manager→安装→重启浏览器。
3.Python3.5
python我就没什么好说的,我用的版本是3.5,2.7的同学可以找一下对应的peewee模块。
数据来源
我需要弄的是《冰火》人物关系图,但是如何从《冰火》中体现出人物的共现呢?我这里将一个章节内出现的所有人物则作为一次共现。因为根据《冰火》小说的特点,每一章都是以一个人物视角来写的,每一章基本都在讲一个主题。如果以每一段作为共现范围的话,那么一个章节下出现的所有角色将会出现很多次共现,而这些共现是无意义的,因为他们都是在同一个主题下出现的。
在网上找了现成的《冰火》txt版本下载,但是发现txt内的数据并不好处理。要么一个卷的所有章节堆到一个txt内,每个章节之间没有特别明显的区分特征,这样就无法用python来对文章章节进行分割;要么就是将文中的每一句作为一行,无法区分段落和章节。思来想去,最标准的格式就是现成的小说在线阅读网址。这样小说的每一段都会用<p></p>
给括起来,用大数据领域的话来说,就是赤裸裸的一个结构化数据。只要是结构化的数据,什么都好处理了。所以这里就觉得顺手写一个爬虫,直接从小说在线阅读的网站把《冰火》抓取下来。我找了几个小说网站,最后看准了这家冰与火之歌小说全集:https://www.sbkk88.com/mingzhu/waiguowenxuemingzhu/bingyuhuozhige/
后面的网页分析以及网页抓取,将会呈现在 Scrapy+redis+mongodb分布式爬虫抓取小说《冰与火之歌1-5》
数据库的设计
根据需求,直接设计一张表足够了。表内属性最多包括id(每一条数据id,作为主键)、chapter(数据来源章节)、title(数据来源章节名)、content(章节内容)、characters(用来存储一个章节中出现的所有角色集合,注意是集合)、url(章节来源网站)、created_at(数据产生时间)。
代码实现
结合peewee,最后实现的代码为:
# -*- coding: utf-8 -*- # @Date : 2017-04-07 10:16:53 # @Author : Alan Lau # @Language : Python3.5 from peewee import * from datetime import datetime db = SqliteDatabase(r'A_Song_of_Ice_and_Fire.sqlite') # 建立名字为A_Song_of_Ice_and_Fire.sqlite的数据库 class BaseModel(Model): class Meta: database = db #新建一个novel表 class novel(BaseModel): id = IntegerField(primary_key=True, verbose_name='id') # 数据id,数据类型是IntegerField,对应sqlite中的Integer,作为主键。 chapter = CharField(max_length=20, null=True, verbose_name='chapter') # 文本章节,数据类型是CharField,对应sqlite中的CHAR,长度为20,允许空值。 title = CharField(max_length=500, null=True, verbose_name='title') # 章节标题,数据类型是CharField,对应sqlite中的CHAR,长度为500(鬼知道一个标题有多长...),允许空值。 content = TextField(null=True, verbose_name='content') # 章节内容,数据类型是TextField,对应sqlite中的TEXT,长文本。 characters = CharField(max_length=200, null=True, verbose_name='characters') # 章节中出现的演员,数据类型是CharField,对应sqlite中的CHAR,长度为200,允许空值。 url = CharField(max_length=200, null=False, verbose_name='url') # 章节的url,方便出错后重爬 created_at = DateTimeField( default=datetime.now(), null=True, verbose_name='Get_time') # 产生日期 if __name__ == '__main__': #执行python try: novel.create_table() #创建表语句 except Exception as err: print(err)
运行一下
最后在代码所在的当前路径下产生
A_Song_of_Ice_and_Fire.sqlite文件
然后用火狐浏览器打开,写一个检索式验证一下:
这里检索式写得不规范,少了个;,大家不要学我….
到现在,一个数据库就设计好了,结合peewee、sqlite、python,是不是非常方便。
Python爱好者社区历史文章大合集:
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
小编的Python入门视频课程!!!
崔老师爬虫实战案例免费学习视频。
丘老师数据科学入门指导免费学习视频。
陈老师数据分析报告制作免费学习视频。
玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
丘老师Python网络爬虫实战免费学习视频。